package PDFmaker;

import bazy.HibernateUtil;
import bazy.SpecyfikacjaZamowienia;
import bazy.Zamowienia;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;
import java.io.IOException;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import logowanie.LogBean;
import org.hibernate.Session;
/**
 * Serwlet obsługujący tworzenie dokumentów PDF
 * @author Michał Kulik
 */
@WebServlet(name = "PdfServlet", urlPatterns = {"/PdfServlet"})
public class PdfServlet extends HttpServlet {

    private final String zam_got_typ = "Zamowienie gotowkowe";
    private final String zam_wew_typ = "Zamowienie wewnetrzne";
    private final String zgl_aw_typ = "Zgloszenie awarii";
    int id_zam;

    /**
    * Obsługa przekazwywania parametrów metodą "POST"
    */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        id_zam = Integer.parseInt(request.getParameter("id"));
        doPost(request, response);

    }
/**
 * Obsługa przekazwywania parametrów metodą "POST"
 */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("application/pdf");
        Document document = new Document();

        try {

            PdfWriter.getInstance(document, response.getOutputStream());
            document.open();

            Session session = HibernateUtil.getSessionFactory().openSession();
            org.hibernate.Transaction tx = session.beginTransaction();
            Zamowienia zam = (Zamowienia) session.load(Zamowienia.class, id_zam);
            tx.commit();
            if (zam.getTypZamowienia().equals(zam_wew_typ)) {
                try {
                    doc_zam_wew(document, zam);
                } catch (Exception ex) {
                    Logger.getLogger(PdfServlet.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else if (zam.getTypZamowienia().equals(zam_got_typ)) {
                try {
                    doc_zak_got(document, zam);
                } catch (Exception ex) {
                    Logger.getLogger(PdfServlet.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else if (zam.getTypZamowienia().equals(zgl_aw_typ)) {
                try {
                    doc_zg_aw(document, zam);
                } catch (Exception ex) {
                    Logger.getLogger(PdfServlet.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            document.close();
            session.close();

        } catch (DocumentException o) {
            o.printStackTrace();
        }

    }
/**
 * Metoda generująca dokument "Zamówienie Wewnętrzne"
 */
    public static void doc_zam_wew(Document document, Zamowienia zam) throws Exception {

        BaseFont bf;
        bf = BaseFont.createFont("/root/times.ttf", BaseFont.CP1250, BaseFont.CACHED);
        Font bold16 = new Font(bf, 16, Font.BOLD);
        bf = BaseFont.createFont("/root/times.ttf", BaseFont.CP1250, BaseFont.CACHED);
        Font normal14 = new Font(bf, 14, Font.NORMAL);
        bf = BaseFont.createFont("/root/arial.ttf", BaseFont.CP1250, BaseFont.CACHED);
        Font bold14 = new Font(bf, 14, Font.BOLD);

        Paragraph paragraf, paragraf2;

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("ZAMÓWIENIE WEWNĘTRZNE", bold16));
        paragraf.setAlignment(Element.ALIGN_CENTER);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        wpis_bold(paragraf, "Dostawca: ", zam.getZapotrzebowanies().iterator().next().getDostawca(), normal14, bold14);
        paragraf.add(new Paragraph("Specyfikacja Zamówienia:  nazwa - typ, ilość*", normal14));

        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

        paragraf = new Paragraph();

        Iterator<SpecyfikacjaZamowienia> spec_iter = zam.getZapotrzebowanies().iterator().next().getSpecyfikacjaZamowienias().iterator();
        int i = 1;
        while (spec_iter.hasNext()) {
            SpecyfikacjaZamowienia spec_zam = spec_iter.next();
            wpis_bold(paragraf, Integer.toString(i) + ")  ", spec_zam.getNazwa() + ", Ilość " + spec_zam.getIlosc() + ", Cena " + spec_zam.getKwota() + " zł", normal14, bold14);
            i++;
        }

        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

        paragraf = new Paragraph();

        if (zam.getZapotrzebowanies().iterator().next().getKwalifikacjaZakupu() == 1) {
            wpis_bold(paragraf, "Kwalifikacja zakupu: ", "materiał", normal14, bold14);
        } else if (zam.getZapotrzebowanies().iterator().next().getKwalifikacjaZakupu() == 2) {
            wpis_bold(paragraf, "Kwalifikacja zakupu: ", "aparatura", normal14, bold14);
        } else if (zam.getZapotrzebowanies().iterator().next().getKwalifikacjaZakupu() == 3) {
            wpis_bold(paragraf, "Kwalifikacja zakupu: ", "oprogramowanie", normal14, bold14);
        }

        wpis_bold(paragraf, "Lączna wartość z narzutami: ", Float.toString(zam.getZapotrzebowanies().iterator().next().getKosztBrutto()), normal14, bold14);

        if (zam.getZrodlofinansowania().equals("dydaktyka")) {
            wpis_bold(paragraf, "Źródlo finansowania ", "dydaktyka", normal14, bold14);
        } else {
            wpis_bold(paragraf, "Źródlo finansowania ", "zlecenie nr: " + zam.getZrodlofinansowania(), normal14, bold14);
        }

        wpis_bold(paragraf, "Inne: ", zam.getKomentarz(), normal14, bold14);

        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("Podpis finansów", normal14));
        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

        paragraf = new Paragraph();
        paragraf.add(new Paragraph("Podpis kierownika", normal14));
        paragraf.setAlignment(Element.ALIGN_RIGHT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(0);
        document.add(paragraf);

        paragraf = new Paragraph();
        paragraf.add(new Paragraph("zakładu, zlecenia", normal14));
        paragraf.setAlignment(Element.ALIGN_RIGHT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("Podpis dyrektora", normal14));
        paragraf.setAlignment(Element.ALIGN_CENTER);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

    }

    /**
    * Metoda generująca dokument "Zgłoszenie Awarii"
    */
    public static void doc_zg_aw(Document document, Zamowienia zam) throws Exception {

        BaseFont bf;
        bf = BaseFont.createFont("/root/times.ttf", BaseFont.CP1250, BaseFont.CACHED);
        Font bold16 = new Font(bf, 16, Font.BOLD);
        bf = BaseFont.createFont("/root/times.ttf", BaseFont.CP1250, BaseFont.CACHED);
        Font normal14 = new Font(bf, 14, Font.NORMAL);
        bf = BaseFont.createFont("/root/arial.ttf", BaseFont.CP1250, BaseFont.CACHED);
        Font bold14 = new Font(bf, 14, Font.BOLD);

        Paragraph paragraf, paragraf2;

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("ZGŁOSZENIE AWARII APARATURY", bold16));
        paragraf.setAlignment(Element.ALIGN_CENTER);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);

        wpis_bold(paragraf, "Nazwa i Typ ", zam.getZgloszeniaAwariis().iterator().next().getNazwa() + " " + zam.getZgloszeniaAwariis().iterator().next().getTyp(), normal14, bold14);
        wpis_bold(paragraf, "Numer inwentarzowy ", zam.getZgloszeniaAwariis().iterator().next().getNumerInwentarzowy(), normal14, bold14);
        wpis_bold(paragraf, "Opis usterki ", zam.getZgloszeniaAwariis().iterator().next().getOpisUsterki(), normal14, bold14);
        
        if (zam.getZgloszeniaAwariis().iterator().next().getNaprawaGwarancyjna()) {
            wpis_bold(paragraf, "Naprawa gwarancyjna ", "TAK", normal14, bold14);
        } else {
            wpis_bold(paragraf, "Naprawa gwarancyjna ", "NIE", normal14, bold14);
        }

        wpis_bold(paragraf, "Numer gwarancji ", zam.getZgloszeniaAwariis().iterator().next().getNumerGwarancji(), normal14, bold14);

        if (zam.getZrodlofinansowania().equals("dydaktyka")) {
            wpis_bold(paragraf, "Źródlo finansowania ", "dydaktyka", normal14, bold14);
        } else {
            wpis_bold(paragraf, "Źródlo finansowania ", "zlecenie nr: " + zam.getZrodlofinansowania(), normal14, bold14);
        }

        wpis_bold(paragraf, "Inne: ", zam.getKomentarz(), normal14, bold14);

        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("Podpis finansów", normal14));
        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

        paragraf = new Paragraph();
        paragraf.add(new Paragraph("Podpis kierownika", normal14));
        paragraf.setAlignment(Element.ALIGN_RIGHT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(0);
        document.add(paragraf);

        paragraf = new Paragraph();
        paragraf.add(new Paragraph("zakładu, zlecenia", normal14));
        paragraf.setAlignment(Element.ALIGN_RIGHT);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("Podpis dyrektora", normal14));
        paragraf.setAlignment(Element.ALIGN_CENTER);
        paragraf.setIndentationLeft(50);
        paragraf.setLeading(25);
        document.add(paragraf);

    }

    /**
    * Metoda generująca dokument "Zamówienie gotówkowe"
    */
    public static void doc_zak_got(Document document, Zamowienia zam) throws Exception {

        BaseFont bf;
        bf = BaseFont.createFont("/root/times.ttf", BaseFont.CP1250, BaseFont.CACHED);
        Font bold14 = new Font(bf, 14, Font.BOLD);
        bf = BaseFont.createFont("/root/times.ttf", BaseFont.CP1250, BaseFont.CACHED);
        Font normal11 = new Font(bf, 11, Font.NORMAL);
        bf = BaseFont.createFont("/root/arial.ttf", BaseFont.CP1250, BaseFont.CACHED);
        Font bold11 = new Font(bf, 11, Font.BOLD);

        Paragraph paragraf, paragraf2;
        Chunk chunk;

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("Wrocław dnia " + zam.getDatazlozeniawniosku(), normal11));
        paragraf.setAlignment(Element.ALIGN_RIGHT);
        paragraf.setIndentationRight(50);
        paragraf.setLeading(13);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph(zam.getUzytkownicy().getImie() + " " + zam.getUzytkownicy().getNazwisko(), bold11));
        paragraf.add(new Paragraph("Imię i nazwisko wnioskodawcy ", normal11));
        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationRight(50);
        paragraf.setLeading(13);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph(zam.getUzytkownicy().getJednostka(), bold11));
        paragraf.add(new Paragraph("Jednostka organizacyjna W-4", normal11));
        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationRight(50);
        paragraf.setLeading(13);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        chunk = new Chunk("WNIOSEK O REALIZACJĘ ZAKUPU GOTÓWKOWEGO", bold14);
        chunk.setUnderline(0.3f, -2f);
        paragraf.add(chunk);
        paragraf.setAlignment(Element.ALIGN_CENTER);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 2);
        paragraf.add(new Paragraph("Przedmiot zakupu:", normal11));
        Iterator<SpecyfikacjaZamowienia> spec_iter = zam.getZapotrzebowanies().iterator().next().getSpecyfikacjaZamowienias().iterator();
        int i = 1;
        while (spec_iter.hasNext()) {
            SpecyfikacjaZamowienia spec_zam = spec_iter.next();
            wpis_bold(paragraf, Integer.toString(i) + ".    ", spec_zam.getNazwa() + ", Kwota " + spec_zam.getKwota() + " zł", normal11, bold11);
            
            i++;
        }
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);

        addEmptyLine(paragraf, 1);
        wpis_bold(paragraf, "Przewidywana łączna kwota brutto zakupu gotówkowego: ", Float.toString(zam.getZapotrzebowanies().iterator().next().getKosztBrutto()), normal11, bold11);
        wpis_bold(paragraf, "Przewidywane miejsce realizacji zakupu: ", zam.getZapotrzebowanies().iterator().next().getDostawca(), normal11, bold11);

        paragraf2 = new Paragraph();
        paragraf2.add(new Chunk("Źródło finansowania: ", normal11));
        paragraf2.add(new Chunk(zam.getZrodlofinansowania(), bold11));
        paragraf2.add(new Chunk(" Podpis dysponenta środków .............................", normal11));
        paragraf.add(paragraf2);

        addEmptyLine(paragraf, 1);
        chunk = new Chunk("Uzasadnienie konieczności realizacji zakupu gotówkowego", normal11);
        chunk.setUnderline(0.3f, -2f);
        paragraf.add(chunk);

        addEmptyLine(paragraf, 2);
        paragraf.add(new Paragraph(zam.getKomentarz(), bold11));

        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationRight(50);
        paragraf.setLeading(16);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 2);
        paragraf.add(new Paragraph("..........................................", normal11));
        paragraf.add(new Paragraph("   Podpis wnioskodawcy   ", normal11));
        paragraf.setAlignment(Element.ALIGN_RIGHT);
        paragraf.setIndentationRight(50);
        paragraf.setLeading(13);
        document.add(paragraf);

        paragraf = new Paragraph();
        paragraf.add(new LineSeparator(0.7f, 100, null, Element.ALIGN_CENTER, -2));
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        chunk = new Chunk("WYPEŁNIA WYDZIAŁOWY KOORDYNATOR DS. ZAMÓWIEŃ PUBLICZNYCH", bold14);
        paragraf.add(chunk);
        paragraf.setAlignment(Element.ALIGN_CENTER);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("Znak sprawy: W-4/GOTÓWKA./...../11", normal11));
        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationRight(50);
        paragraf.setLeading(13);
        document.add(paragraf);

        paragraf = new Paragraph();
        addEmptyLine(paragraf, 1);
        document.add(paragraf);

        PdfPTable table = new PdfPTable(3);

        table.setWidthPercentage(100);

        paragraf = new Paragraph();
        paragraf.add(new Paragraph("Zgoda na zakup:", normal11));
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("   - Tak *)", normal11));
        paragraf.add(new Paragraph("   - Nie *)", normal11));
        addEmptyLine(paragraf, 6);
        paragraf.add(new Paragraph("        ..........................................", normal11));
        paragraf.add(new Paragraph("           (Pieczątka i podpis)   ", normal11));
        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationRight(50);
        paragraf.setLeading(20);
        table.addCell(paragraf);

        paragraf = new Paragraph();
        paragraf.add(new Paragraph("Zgodność faktury z wnioskiem:", normal11));
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("   - Tak *)", normal11));
        paragraf.add(new Paragraph("   - Nie *)", normal11));
        addEmptyLine(paragraf, 6);
        paragraf.add(new Paragraph("        ..........................................", normal11));
        paragraf.add(new Paragraph("           (Pieczątka i podpis)   ", normal11));
        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationRight(50);
        paragraf.setLeading(20);
        table.addCell(paragraf);

        paragraf = new Paragraph();
        paragraf.add(new Paragraph("Zgoda na zarejstrowanie i rozliczenie faktury:", normal11));
        addEmptyLine(paragraf, 1);
        paragraf.add(new Paragraph("   - Tak *)", normal11));
        paragraf.add(new Paragraph("   - Nie *)", normal11));
        addEmptyLine(paragraf, 5);
        paragraf.add(new Paragraph("        ..........................................", normal11));
        paragraf.add(new Paragraph("           (Pieczątka i podpis)   ", normal11));
        paragraf.setAlignment(Element.ALIGN_LEFT);
        paragraf.setIndentationRight(50);
        paragraf.setLeading(20);
        table.addCell(paragraf);

        document.add(table);

    }

    private static void addEmptyLine(Paragraph paragraph, int number) {
        for (int i = 0; i < number; i++) {
            paragraph.add(new Paragraph(" "));
        }
    }

    private static void wpis_bold(Paragraph paragraf, String pierwszy, String drugi, Font f1, Font f2) {
        Paragraph paragraf2;
        paragraf2 = new Paragraph();
        paragraf2.add(new Chunk(pierwszy, f1));
        paragraf2.add(new Chunk(drugi, f2));
        paragraf.add(paragraf2);
    }
}
